<?php

	require_once("calciatore.php");
	require_once(dirname(__FILE__) . "/../model/db_driver.php");
	
	/*
	 * Classe SquadraDesc contiene i campi che descrivono la squadra 
	 */
	class SquadraDesc {
    	private $id;
    	private $nome;
		private $budget;
		private $urlImgLogo;
		private $allenatore;
		private $allenatoreId;
		
		public function __construct($_id, $_nome, $_budget, $_logo, $_allenatore, $allenatoreId){
			$this->id = $_id;
			$this->nome = $_nome;
			$this->budget = $_budget;
			$this->urlImgLogo = $_logo;
			$this->allenatore = $_allenatore;
			$this->allenatoreId = $allenatoreId;
		}
		
		public function __destruct(){
			unset($this->id);
			unset($this->nome);
			unset($this->budget);
			unset($this->urlImgLogo);
			unset($this->allenatore);
			unset($this->allenatoreId);
		}
		
		public function getId(){
			return $this->id;
		}
		
		public function getNome(){
			return $this->nome;
		}
		
		public function setNome($nome){
			$this->nome = $nome;
		}
		
		public function getBudget(){
			return $this->budget;
		}
		
		public function setBudget($budget){
			$this->budget = $budget;
		}
		
		public function getUrlImgLogo(){
			if($this->urlImgLogo == null || $this->urlImgLogo == ""){
				return "&nbsp;";
			}else{
				return $this->urlImgLogo;
			}
		}
		
		public function setUrlImgLogo($img){
			$this->urlImgLogo = $img;
		}
		
		public function getAllenatore(){
			return $this->allenatore;
		}
		
		public function getAllenatoreId(){
			return $this->allenatoreId;
		}
		
		public function setAllenatoreId($idUser){
			$this->allenatoreId = $idUser;
		}
		
		public function save(){
			$db = new DbDriver();
			if($this->id>0){
				$db->saveTeam($this);
			}else {
				$db->insertTeam($this);
			}
		}
		
		public static function getSquadre($lega_id){
			return caricaSquadreDesc($lega_id, true);
		}
		
		public static function getNoSquadre($lega_id){
			return caricaSquadreDesc($lega_id, false);
		}
		
		public static function getTutteSquadre(){
		/*restituisce la lista di tutte le squadre*/
			return caricaSquadreDesc(-1);
		}
		
		public static function getSquadreUtente($userId){
			$db = new DbDriver();
			$db_squadre = $db->db_getSquadreUtente($userId);
			$squadre = array();
			for($i=0; $i < count($db_squadre); $i++){
				array_push($squadre, new SquadraDesc(
					$db_squadre[$i][0], //id
					$db_squadre[$i][1], //nome
					$db_squadre[$i][2], //budget
					$db_squadre[$i][3], //urlImgLogo
					$db_squadre[$i][4], //allenatore
					$db_squadre[$i][5] //id utente dell'allenatore
				));
			}
			return $squadre;	
		}
		
		public static function getSquadra($idSquadra){
			$db = new DbDriver();
			$db_squadre = $db->db_getSquadra($idSquadra);
			return new SquadraDesc(
				$db_squadre[0][0], //id
				$db_squadre[0][1], //nome
				$db_squadre[0][2], //budget
				$db_squadre[0][3], //urlImgLogo
				$db_squadre[0][4], //allenatore
				$db_squadre[0][5] //id utente dell'allenatore
			);
		} 
		
		public static function getUltimaFormazione($idSquadra, $stagione){
		/*Restituisce la giornata dell'ultima formazione inviata per questa stagione*/
			$db = new DbDriver();
			return $db->getUltimaFormazione($idSquadra, $stagione);
		}
	} //end class SquadraDesc
	
	
	
	/*
	 * Classe Squadra (contiene la lista dei suoi calciatori)
	 */

    class Squadra extends SquadraDesc{
		private $giocatori;

		
		public function __construct($_id, $_nome, $_budget, $_giocatori, $_logo, $_allenatore, $_allenatoreId){
			parent::__construct($_id, $_nome, $_budget, $_logo, $_allenatore, $_allenatoreId);
			$this->giocatori = $_giocatori;
		}
		
		public function __destruct(){
			parent::__destruct();
			foreach($this->giocatori as $g){
				$g->__destruct();
			}
		}
				
		public function getGiocatore($i){
			return $this->giocatori[$i];
		}
		
		public function getNumGiocatori(){
			return count($this->giocatori);
		}
		
		public function getFreePlayers($stagione){
		/* restitusice una lista dei giocatori non appartenenti a questa squadra */
			$driver = new DbDriver();
			$db_players = $driver->db_getNoGiocatori($this->getId(), $stagione);
			for($k = 0; $k < count($db_players); $k++){
				$giocatori[$k] = new Calciatore(
					$db_players[$k][0], //id
					$db_players[$k][1], //nome
					$db_players[$k][2], //ruolo
					$db_players[$k][3], //squadra
					$db_players[$k][4], //costo
					$db_players[$k][5] //stato giocatore (in rosa, fuori rosa, ecc.)
					);
			}
			return $giocatori;
		}
		
		public static function caricaSquadra($teamId, $stagione){
			$sd = SquadraDesc::getSquadra($teamId, false);
			$driver = new DbDriver();
			$db_players = $driver->db_getGiocatori($teamId, $stagione);
			$giocatori = array();
			//carica i calciatori di questa squadra e li mette in una collezione di ogetti Giocatori
			for($k = 0; $k < count($db_players); $k++){
				$giocatori[$k] = new Calciatore(
					$db_players[$k][0], //id
					$db_players[$k][1], //nome
					$db_players[$k][2], //ruolo
					$db_players[$k][3], //squadra
					$db_players[$k][4], //costo
					$db_players[$k][5] //stato giocatore (in rosa, fuori rosa, ecc.)
					);
			}
			return new Squadra(
				$teamId,
				$sd->getNome(),
				$sd->getBudget(),
				$giocatori,
				$sd->getUrlImgLogo(),
				$sd->getAllenatore(),
				$sd->getAllenatoreId());
		}
		
		public static function caricaMigliorFormazione($teamId, $giornataA){
		/*Restituisce un array ordinato per ruolo di oggetti MigliorCalciatore*/
			$db = new DbDriver();
			$db_players = $db->db_getBestPlayers($teamId, $giornataA);
			$calciatore = null;
			$giocatori = array();
			$portiere = null;
			$difensori =array();
			$centrocampisti = array();
			$attaccanti = array();
			$n_players = 0;
			$n_difensori = 0;
			$n_centrocampisti = 0;
			$n_attaccanti = 0;
			//carica i calciatori di questa squadra e li mette in una collezione di ogetti Giocatori
			for($k = 0; $k < count($db_players); $k++){
				$calciatore = new MigliorCalciatore(
					$db_players[$k][0], //id
					$db_players[$k][1], //ruolo
					$db_players[$k][2], //nome
					$db_players[$k][3], //squadra
					$db_players[$k][4], //fanta voto
					$db_players[$k][5]  //stagione
					);
				switch($calciatore->getRuolo()){
					case "P":
						if($portiere == null) {
							$portiere = $calciatore;
						}
						break;
					case "D";
						if(Squadra::formazioneValida($n_difensori+1, $n_centrocampisti, $n_attaccanti)){
							array_push($difensori, $calciatore);
							$n_players++;
							$n_difensori++;
						}
						break;
					case "C";
						if(Squadra::formazioneValida($n_difensori, $n_centrocampisti+1, $n_attaccanti)){
							array_push($centrocampisti, $calciatore);
							$n_players++;
							$n_centrocampisti++;
						}
						
						break;
					case "A":
						if(Squadra::formazioneValida($n_difensori, $n_centrocampisti, $n_attaccanti+1)){
							array_push($attaccanti, $calciatore);
							$n_players++;
							$n_attaccanti++;
						}
						break;
				}
			}
			array_push($giocatori, $portiere);
			$giocatori = Squadra::array_push_array($giocatori, $difensori);
			$giocatori = Squadra::array_push_array($giocatori, $centrocampisti);
			$giocatori = Squadra::array_push_array($giocatori, $attaccanti);
			return $giocatori;
		}

		private static function formazioneValida($n_dif, $n_cen, $n_att){
		/*Controlla se, in base al numero specificato di difensori, centrocampist
		 * e attccanti, si può raggiungere una formazione valida*/
			return !(($n_dif+$n_cen+$n_att>10) ||
				$n_dif > 5 || $n_cen > 5 || $n_att > 3 || 
				 (($n_cen==5 || $n_dif==5) && ($n_att==3)));
		}

		private static function array_push_array($dest_array, $source_array){
			foreach($source_array as $v){
				array_push($dest_array, $v);
			}
			return $dest_array;
		}
		
		public static function cambiaStatoGiocatore($playerId, $teamId, $stato){
		/* Modifica lo stato di un giorocato in una rosa */
			$db = new DbDriver();
			$db->changePlayerStatus($playerId, $teamId, $stato);
		}
		
		public static function aggiungiGiocatore($playerId, $teamId, $costo){
			$db = new DbDriver();
			$db->addPlayerToTeam($playerId, $teamId, $costo);
		}
		
    } //end class squadra
    
    function caricaSquadreDesc($lega_id, $owner=true){
	/* se owner = true allora carica le squadra appartenenti a questa lega,
	 * altrimenti quelle che non le appartengono*/
    	$driver = new DbDriver();
		$db_squadre = null;
		if($lega_id > -1){
			$db_squadre = $driver->db_getSquadre($lega_id, $owner);
		}else{
			$db_squadre = $driver->db_getTutteSquadre();
		}
		$squadre = array();
		for($i=0; $i < count($db_squadre); $i++){
			array_push($squadre, new SquadraDesc(
				$db_squadre[$i][0], //id
				$db_squadre[$i][1], //nome
				$db_squadre[$i][2], //budget
				$db_squadre[$i][3], //urlImgLogo
				$db_squadre[$i][4], //allenatore
				$db_squadre[$i][5] //id utente dell'allenatore
			));
		}
		return $squadre;		
    }
	
	function caricaSquadre($lega){
		$driver = new DbDriver();
		$db_teams = $driver->db_getSquadre($lega);
		$squadre = array();
		for($i = 0; $i < count($db_teams); $i++){
			$teamId = $db_teams[$i][0];
			$db_players = $driver->db_getGiocatori($teamId);
			$giocatori = array();
			//carica i calciatori di questa squadra e li mette in una collezione di ogetti Giocatori
			for($k = 0; $k < count($db_players); $k++){
				$giocatori[$k] = new Calciatore(
					$db_players[$k][0], //id
					$db_players[$k][1], //nome
					$db_players[$k][2], //ruolo
					$db_players[$k][3], //squadra
					$db_players[$k][4], //costo
					$db_players[$k][5] //stato giocatore (in rosa, fuori rosa, ecc.)
					);
			}
			
			$squadre[$i] = new Squadra(
				$teamId,
				$db_teams[$i][1], //nome squadra
				$db_teams[$i][2], //budget residuo
				$giocatori,
				$db_teams[$i][3], //logo squadra
				$db_teams[$i][4], //allenatore
				$db_teams[$i][5] //id dell'utente allenatore
				);
		} //end for
		return $squadre;
	}
	
?>